/*
1.路径解析：::
2.方法调用和字段访问：., .(), []
3.函数调用和构造器：(), {}
4.一元运算符：
? (错误传播)
! (宏调用)
- (负号)
* (解引用)
& 和 &mut (引用)
! (逻辑非)
5.类型转换：as
6.乘除取模：*, /, %
7.加减：+, -
8.位移：<<, >>
9.按位与：&
10.按位异或：^
11.按位或：|
12.比较：
==, !=
<, >, <=, >=
13.逻辑与：&&
14.逻辑或：||
15.范围：.., ..=
16.赋值和复合赋值：
=
+=, -=, *=, /=, %=
&=, |=, ^=, <<=, >>=
17.闭包：|...| ...
*/
fn main() {
    println!("Please input number:");
    let mut tmpstr = String::new();
    std::io::stdin().read_line(&mut tmpstr).expect("Failed to read line");
    println!("input string: {}", tmpstr);
    loop {
        let tmprst = tmpstr.trim().parse::<i32>();
        // core::result::Result<i32, core::num::error::ParseIntError>
        // println!("[{},{}]:tv={}", file!(), line!(), type_str(tmprst));
        if tmprst.is_err() {
            println!("[{},{}]get int fail", file!(), line!());
            break;
        }
        let tmpi = tmprst.unwrap();
        println!("[{},{}]:tv={}", file!(), line!(), tmpi);
        break;
    }
    {
        // trim 去掉头尾空白字符。
        // let tmpi32 = tmpstr.trim().parse::<i32>().unwrap();
        let tmpi32 = tmpstr.trim().parse::<i32>().expect("need input number string!");
        // 使用unwrap或expect方法，输入错误会导致终止运行，因此不推荐。
        if tmpi32 < 0 {
            println!("<0");
        } else if tmpi32 == 0 {
            println!("0");
        } else {
            println!(">0");
        }
        if tmpi32 >= 2 && (tmpi32 < 4) {
            println!("val ok");
        }
        {
            // if else return data must same type!
            let tmpval = if tmpi32 == 10 {
                true 
            } else {
                false
            };
            println!("[{},{}]:tv={}", file!(), line!(), tmpval);
        }
    }
}

fn type_str<T>(_val: T) -> & 'static str {
    std::any::type_name::<T>()
}